-
Notifications
You must be signed in to change notification settings - Fork 13.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
rustdoc-json: Output target feature information #139393
base: master
Are you sure you want to change the base?
rustdoc-json: Output target feature information #139393
Conversation
r? @notriddle rustbot has assigned @notriddle. Use |
This comment has been minimized.
This comment has been minimized.
7c6a12b
to
cb2b075
Compare
rustdoc-json-types is a public (although nightly-only) API. If possible, consider changing |
I'm unsure about two topics here:
Besides stable and unstable, there is also /// This feature can not be set via `-Ctarget-feature` or `#[target_feature]`, it can only be
/// set in the target spec. It is never set in `cfg(target_feature)`. Used in
/// particular for features are actually ABI configuration flags (not all targets are as nice as
/// RISC-V and have an explicit way to set the ABI separate from target features).
Forbidden { reason: &'static str }, I decided forbidden features are effectively internal implementation details (unreachable by the user) and so I drop them from the list. |
A new struct field is backwards compatible (edit: if it's |
cb2b075
to
58fd7b4
Compare
Got it. Is there a better way to phrase this requirement, and if so, would it belong in this PR? rust/src/rustdoc-json-types/lib.rs Lines 28 to 33 in 58fd7b4
|
Looking closer at your code I think this is actually a breaking change since the new field is not To be clear: I expect JSON from an old nightly to fail to deserialize into the new struct, but I expect JSON from a new nightly to successfully deserialize into the old struct. |
Oh, sure, I was thinking about the old-reading-new case and not the new-reading-old case. You're absolutely right that this is a breaking change. |
Yep,
rustdoc-json is an unstable feature, and like all unstable features is not available/supported on a stable toolchain. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for working on this! I think the overall approach makes sense.
This needs to have some tests, which will be in the src/rustdoc-json
suite. It's not yet documented, sorry. It's probably best to start by looking at some examples.
src/librustdoc/json/mod.rs
Outdated
types::Target { | ||
target_features: sess | ||
.target | ||
.rust_target_features() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There should be a comment why you need to use this and not tcx.rust_target_features
. Rustdoc kinda fakes what's going on with target features because it wants to run for multiple targets. See #137632 for details.
58fd7b4
to
4ccc3c0
Compare
This comment has been minimized.
This comment has been minimized.
I have a // Target tests are necessarily target-specific
// aarch64-*-*:
// `sve2` is stable and implies `sve`
//@[aarch64] is "$.target.target_features[?(@.name=='sve2')].unstable_feature_gate" null
//@[aarch64] has "$.target.target_features[?(@.name=='sve2')].implies_features[*]" \"sve\"
// aarch64-apple-darwin:
// We have the right triple, and `sve2` is enabled by default
//@[aarch64-apple-darwin] is "$.target.triple" \"aarch64-apple-darwin\"
//@[aarch64-apple-darwin] is "$.target.target_features[?(@.name=='sve2')].globally_enabled true I'll add similar coverage for other tier 1 targets. |
4ccc3c0
to
5cc3718
Compare
Some changes occurred in tests/rustdoc-json Some changes occurred in src/tools/compiletest cc @jieyouxu |
It turns out that jsondocck doesn't support |
5cc3718
to
83b1504
Compare
This comment has been minimized.
This comment has been minimized.
83b1504
to
68c9794
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This looks really close. A couple more things that still need tests.
implies_features
andunstable_feature_gate
fields- That we dont have features from other architectures. e.g. x86 doesn't have sve, and aarch64 doesn't have avx. (Because rustdoc sometimes does spooky stuff here)
These tests don't need to be super exhaustive across a wide variety of archetectures, as that doesn't actually get us any more coverage (remember, we don't need to test that rustc has correct target features, only that rustdoc correctly conveys it), but does increase the maintenence burden.
@rustbot author
@@ -142,6 +142,9 @@ impl CommandKind { | |||
(_, false) if KNOWN_DIRECTIVE_NAMES.contains(&command_name) => { | |||
return None; | |||
} | |||
(name, _) if name.starts_with("only-") => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this also needed given the updates to the KNOWN_DIRECTIVE_NAMES
list?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, due to command parsing differences between the tools. The line //@ only-aarch64-apple-darwin
otherwise causes:
Invalid command `//@ only-aarch`
Reminder, once the PR becomes ready for a review, use |
68c9794
to
0632832
Compare
`#[target_feature]` attributes refer to a target-specific list of features. Enabling certain features can imply enabling other features. Certain features are always enabled on certain targets, since they are required by the target's ABI. Features can also be enabled indirectly based on other compiler flags. Feature information is ultimately known to `rustc`. Rather than force external tools to track it -- which may be wildly impractical due to `-C target-cpu` -- have `rustdoc` output `rustc`'s feature data.
0632832
to
4ecdefd
Compare
@aDotInTheVoid Thanks! I rebased, and added tests to exercise the other two fields and verify non-existence of a target feature for each tier 1 target. @rustbot ready |
#[target_feature]
attributes refer to a target-specific list of features. Enabling certain features can imply enabling other features. Certain features are always enabled on certain targets, since they are required by the target's ABI. Features can also be enabled indirectly based on other compiler flags.Feature information is ultimately known to
rustc
. Rather than force external tools to track it – which may be wildly impractical due to-C target-cpu
– haverustdoc
outputrustc
's feature data.This change is motivated by obi1kenobi/cargo-semver-checks#1246, which intends to detect semver hazards caused by
#[target_feature]
.